﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Data.OleDb; //подключение OleDb
using Domain; //подключение проекта Domain
using System.Data; //подключение System.Data, нужна ниже в коде
using Setting;


namespace Session
{
    public class BrokerPersonal
    {
        OleDbConnection connection; // объявление OleDbConnection
        OleDbCommand command; // объявление OleDbCommand
        string x, f, v; // объявление переменных для функции "поиск по id"
        Props prop = new Props();
        string dbpath;

        private void readSetting()
        {
            prop.ReadXml();
            dbpath = Convert.ToString(prop.Fields.dbpath);

        }

        private void ConnectTo() // функция подключения БД
        {
            readSetting();
            connection = new OleDbConnection(@" Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + dbpath + "; Persist Security Info = False;"); // объявление техналогии и пути
            command = connection.CreateCommand(); // Создает и возвращает объект OleDbCommand, связанный с объектом OleDbConnection.

        }


        public BrokerPersonal() // функция для класса BrokerPersonal
        {
            ConnectTo(); // вызов функции подключения
        }

        public bool SignIn(Dm_Pers prs) // функция входа
        {
            try
            {
                command.CommandText = "SELECT login, pass FROM T_pers WHERE login='" + prs.Login + "' and pass= '" + prs.Pass + "'"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                int count = 0; // обявления переменной для подсчета совпадений

                while (reader.Read()) // цикл на чтение
                {
                    count = count + 1; // если есть совпадение, то count++
                }

                if (count == 1) // если только одно совпадение
                {
                    return true;
                }
                else
                {
                    return false;
                }


            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                    
                }
            }
        }

        public string Phone(Dm_Pers prs) // функция входа
        {
            try
            {
                command.CommandText = "SELECT [login], [pass], [phone] FROM [T_pers] WHERE [login]='" + prs.Login + "' and [phone]= '" + prs.Phone + "'"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                int count = 0; // обявления переменной для подсчета совпадений

                while (reader.Read()) // цикл на чтение
                {
                    count = count + 1; // если есть совпадение, то count++
                    v = reader["pass"].ToString();
                }

                if (count == 1) // если только одно совпадение
                {
                    return v;
                }
                else
                {
                    v = "Нет совпадений";
                    return v;
                }

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public void OnWork(Dm_Pers prs) // функция установки флага о том, что пользователь зашел в сеть
        {
            try
            {
                command.CommandText = "UPDATE T_pers SET on_work = yes WHERE  login='" + prs.Login + "'"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public void OffWork(Dm_Pers prs) // функция установки флага о том, что пользователь вышел из сети
        {
            try
            {
                command.CommandText = "UPDATE T_pers SET on_work = no WHERE  login='" + prs.Login + "'"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.
            }

            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public void CkPers(Dm_Pers prs) // функция на определения отдела того, кто вошел
        {
            try
            {
                command.CommandText = "SELECT [login], [id_pers], [f_name], [l_name], [id_dep], [id_post] FROM [T_pers] WHERE [login]='" + prs.Login + "'"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_User.Id_pers = Convert.ToInt32(reader["id_pers"].ToString());
                    Dm_User.Id_dep = Convert.ToInt32(reader["id_dep"].ToString());
                    Dm_User.Id_post = Convert.ToInt32(reader["id_post"].ToString());
                    Dm_User.F_name = reader["f_name"].ToString();
                    Dm_User.L_name = reader["l_name"].ToString();
                }

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }
        
        public void Insert(Dm_Pers prs, Dm_Post pst, Dm_Dep dep) // функция добавления новой записи
        {
            try
            {
                command.CommandText = "INSERT INTO t_pers(f_name, l_name, id_post, id_dep, login, pass, phone) VALUES('" + prs.F_name + "' , '" + prs.L_name + "', '" + pst.Id_post + "', '" + dep.Id_dep + "', '" + prs.Login + "', '" + prs.Pass + "', '" + prs.Phone + "')"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public List<Dm_Post> FillComboBoxPost() // функция для заполнения ComboBox из Dm_Post
        {
            List<Dm_Post> pstList = new List<Dm_Post>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT * FROM t_post"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Post pst = new Dm_Post(); // объявление Dm_Post


                    pst.Id_post = Convert.ToInt32(reader["Id_post"].ToString()); // чтение Id_post из БД и занисение информации в pst.Id_post
                    pst.Name_post = reader["Name_post"].ToString(); // чтение Name_post из БД и занисение информации в  pst.Name_post


                    pstList.Add(pst); // добавление данных в List< >
                }

                return pstList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public List<Dm_Dep> FillComboBoxDep() // функция для заполнения ComboBox из Dm_Dep
        {
            List<Dm_Dep> depList = new List<Dm_Dep>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT * FROM t_dep"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Dep dep = new Dm_Dep(); // объявление Dm_Dep


                    dep.Id_dep = Convert.ToInt32(reader["Id_dep"].ToString()); // чтение Id_dep из БД и занисение информации в dep.Id_dep
                    dep.Dep = reader["Dep"].ToString(); // чтение Dep из БД и занисение информации в dep.Dep



                    depList.Add(dep); // добавление данных в List< >
                }

                return depList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }     
       
        public List<Dm_Pers> FillGrid() // функция для заполнения Grid
        {
            List<Dm_Pers> prsList = new List<Dm_Pers>(); // объявление List< >

            try
            {
                command.CommandText = "SELECT T_Pers.id_pers, T_Pers.F_name, T_Pers.L_name, T_Pers.id_post AS T_Pers_id_post, T_Pers.id_dep AS T_Pers_id_dep, T_Pers.login, T_Pers.pass, T_Pers.on_work, T_Pers.phone, T_Post.id_post AS T_Post_id_post, T_Post.name_post, T_Dep.id_dep AS T_Dep_id_dep, T_Dep.dep FROM T_Post INNER JOIN (T_Dep INNER JOIN T_Pers ON T_Dep.[id_dep] = T_Pers.[id_dep]) ON T_Post.[id_post] = T_Pers.[id_post]"; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    Dm_Pers prs = new Dm_Pers(); // объявление Dm_Pers

                    prs.Id_pers = Convert.ToInt32(reader["Id_pers"].ToString()); // чтение Id_pers из БД и занисение информации в prs.Id_pers
                    prs.F_name = reader["F_name"].ToString(); // чтение F_name из БД и занисение информации в prs.F_name
                    prs.L_name = reader["L_name"].ToString(); // чтение L_name из БД и занисение информации в prs.L_name
                    prs.Name_post = reader["name_post"].ToString(); // чтение Id_dep из БД и занисение информации в prs.Id_dep
                    prs.Name_dep = reader["dep"].ToString(); // чтение Id_post из БД и занисение информации в prs.Id_post
                    prs.Login = reader["Login"].ToString(); // чтение Login из БД и занисение информации в prs.Login
                    prs.Pass = reader["Pass"].ToString(); // чтение Pass из БД и занисение информации в prs.Pass
                    prs.Phone = reader["Phone"].ToString(); // чтение Pass из БД и занисение информации в prs.Pass
                    prs.On_work = Convert.ToBoolean(reader["On_work"].ToString()); // чтение On_work из БД и занисение информации в prs.On_work


                    prsList.Add(prs); // добавление данных в List< >
                }

                return prsList; // возврат List< >
            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }

        }

        public void Update(Dm_Pers OldPrs, Dm_Pers NewPrs, Dm_Post post, Dm_Dep dep) // функция обновления записи по id
        {
            try
            {
                command.CommandText = "UPDATE t_pers SET f_name='" + NewPrs.F_name + "' , l_name ='" + NewPrs.L_name + "' , id_post ='" + post.Id_post + "' , id_dep ='" + dep.Id_dep + "' , login ='" + NewPrs.Login + "' , pass ='" + NewPrs.Pass + "' , phone ='" + NewPrs.Phone + "' WHERE id_pers=" + OldPrs.Id_pers; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public void Delete(Dm_Pers prs) // функция удаления записи по id
        {
            try
            {
                command.CommandText = "DELETE FROM t_pers WHERE id_pers=" + prs.Id_pers; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public string indexPost(int id) // функция "поиск по id" 
        {
            try
            {
                command.CommandText = "SELECT [id_post], [name_post] FROM [T_post] WHERE [id_post] =" + id; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    f = reader["name_post"].ToString(); // чтение name_post из БД и занисение информации в  f                 
                }

                return x = f; // возврат значения f

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }

        public string indexDep(int id) // функция "поиск по id" 
        {
            try
            {
                command.CommandText = "SELECT [id_dep], [dep] FROM [T_dep] WHERE [id_dep] =" + id; // текст SQL команды
                command.CommandType = CommandType.Text; // Возвращает или задает значение, указывающее, как будет интерпретироваться свойство CommandText.
                connection.Open(); // открыте подключения

                command.ExecuteNonQuery(); // возвращает количество задействованных в инструкции строк.

                OleDbDataReader reader = command.ExecuteReader(); // объявление OleDbDataReader

                while (reader.Read()) // цикл на чтение
                {
                    f = reader["dep"].ToString(); // чтение dep из БД и занисение информации в f                 
                }

                return x = f; // возврат значения f

            }

            catch (Exception)
            {
                throw;
            }

            finally
            {
                if (connection != null) // условие на проверку открытось поделючения
                {
                    connection.Close(); // закрытие подключения
                }
            }
        }
    }

}
